package com.example.service.repository;

import com.example.service.entity.SystemTenant;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

/**
 * 租户数据访问接口
 * 
 * @author example
 * @since 1.0.0
 */
@Repository
public interface SystemTenantRepository extends JpaRepository<SystemTenant, Long>, JpaSpecificationExecutor<SystemTenant> {
    
    /**
     * 根据租户名称查找租户
     * 
     * @param name 租户名称
     * @return 租户对象
     */
    Optional<SystemTenant> findByName(String name);
    
    /**
     * 根据租户邮箱查找租户
     * 
     * @param email 租户邮箱
     * @return 租户对象
     */
    Optional<SystemTenant> findByEmail(String email);
    
    /**
     * 根据租户电话查找租户
     * 
     * @param phone 租户电话
     * @return 租户对象
     */
    Optional<SystemTenant> findByPhone(Long phone);
    
    /**
     * 查找所有未删除的租户
     * 
     * @return 租户列表
     */
    List<SystemTenant> findByIsDeleted(Integer isDeleted);
    
    /**
     * 查找所有正常状态的租户
     * 
     * @param status 状态值
     * @return 租户列表
     */
    List<SystemTenant> findByStatus(Short status);
    
    /**
     * 检查租户名称是否已存在
     * 
     * @param name 租户名称
     * @return 是否存在
     */
    boolean existsByName(String name);
    
    /**
     * 检查租户邮箱是否已存在
     * 
     * @param email 租户邮箱
     * @return 是否存在
     */
    boolean existsByEmail(String email);
    
    /**
     * 检查租户电话是否已存在
     * 
     * @param phone 租户电话
     * @return 是否存在
     */
    boolean existsByPhone(Long phone);
    
    /**
     * 查找授权用户数小于授权用户总数的租户
     * 
     * @return 租户列表
     */
    @Query("SELECT t FROM SystemTenant t WHERE t.readyUserCount < t.permissionUserCount AND t.isDeleted = 0")
    List<SystemTenant> findTenantsWithAvailableUserSlots();
    
    /**
     * 查找即将过期的租户
     * 
     * @param days 天数
     * @return 租户列表
     */
    @Query("SELECT t FROM SystemTenant t WHERE t.permissionEnd <= CURRENT_DATE + :days AND t.permissionEnd > CURRENT_DATE AND t.isDeleted = 0")
    List<SystemTenant> findTenantsExpiringInDays(@Param("days") int days);
} 